// Filename: eggJointData.I
// Created by:  drose (23Feb01)
//
////////////////////////////////////////////////////////////////////
//
// PANDA 3D SOFTWARE
// Copyright (c) Carnegie Mellon University.  All rights reserved.
//
// All use of this software is subject to the terms of the revised BSD
// license.  You should have received a copy of this license along
// with this source code in a file named "LICENSE."
//
////////////////////////////////////////////////////////////////////


////////////////////////////////////////////////////////////////////
//     Function: EggJointData::get_parent
//       Access: Public
//  Description:
////////////////////////////////////////////////////////////////////
INLINE EggJointData *EggJointData::
get_parent() const {
  return _parent;
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::get_num_children
//       Access: Public
//  Description:
////////////////////////////////////////////////////////////////////
INLINE int EggJointData::
get_num_children() const {
  return _children.size();
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::get_child
//       Access: Public
//  Description:
////////////////////////////////////////////////////////////////////
INLINE EggJointData *EggJointData::
get_child(int n) const {
  nassertr(n >= 0 && n < (int)_children.size(), (EggJointData *)NULL);
  return _children[n];
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::find_joint
//       Access: Public
//  Description: Returns the first descendent joint found with the
//               indicated name, or NULL if no joint has that name.
////////////////////////////////////////////////////////////////////
INLINE EggJointData *EggJointData::
find_joint(const string &name) {
  EggJointData *joint = find_joint_exact(name);
  if (joint == (EggJointData *)NULL) {
    joint = find_joint_matches(name);
  }
  return joint;
}


////////////////////////////////////////////////////////////////////
//     Function: EggJointData::has_rest_frame
//       Access: Public
//  Description: Returns true if the joint knows its rest frame, false
//               otherwise.  In general, this will be true as long as
//               the joint is included in at least one model file, or
//               false if it appears only in animation files.
////////////////////////////////////////////////////////////////////
INLINE bool EggJointData::
has_rest_frame() const {
  return _has_rest_frame;
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::rest_frames_differ
//       Access: Public
//  Description: Returns true if the rest frames for different models
//               differ in their initial value.  This is not
//               technically an error, but it is unusual enough to be
//               suspicious.
////////////////////////////////////////////////////////////////////
INLINE bool EggJointData::
rest_frames_differ() const {
  return _rest_frames_differ;
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::get_rest_frame
//       Access: Public
//  Description: Returns the rest frame of the joint.  This is the
//               matrix value that appears for the joint in each model
//               file; it should be the same transform in each model.
////////////////////////////////////////////////////////////////////
INLINE const LMatrix4d &EggJointData::
get_rest_frame() const {
  nassertr(has_rest_frame(), LMatrix4d::ident_mat());
  return _rest_frame;
}

////////////////////////////////////////////////////////////////////
//     Function: EggJointData::reparent_to
//       Access: Public
//  Description: Indicates an intention to change the parent of this
//               joint to the indicated joint, or NULL to remove it
//               from the hierarchy.  The joint is not reparented
//               immediately, but rather all of the joints are
//               reparented at once when do_reparent() is called.
////////////////////////////////////////////////////////////////////
INLINE void EggJointData::
reparent_to(EggJointData *new_parent) {
  _new_parent = new_parent;
}
